package cn.lcvc.xnc.application.common.utils.table;

import cn.hutool.poi.excel.ExcelWriter;
import cn.hutool.poi.excel.StyleSet;
import org.apache.poi.ss.usermodel.*;

/**
 * hutool表格操作的一些自定义样式工具
 */
public class MyHutoolCustomExcelUtil {

    /**
     * 方法描述: 在原有全局的基础样式上进行设置，修改所有单元格样式
     * 特别说明：执行该方法后会自动修改表格的标题样式（也就是说函数用void修饰也可以）
     * 1.全局单元格样式
     * 默认 全局水平居中+垂直居中
     * 默认 自动换行
     * 默认单元格边框颜色为黑色，细线条
     * 默认背景颜色为白色
     * 2.标题栏样式
     * 参加标题栏样式函数说明：灰色背景
     * @param writer writer
     * @return cn.hutool.poi.excel.StyleSet
     * @author wqf
     * @date 2021/5/28 10:43
     */
    public static StyleSet setBaseGlobalStyle(ExcelWriter writer) {
        //全局样式设置
        StyleSet styleSet = writer.getStyleSet();
        //设置全局文本居中
        styleSet.setAlign(HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
        //设置字体样式
        Font font= MyHutoolExcelUtil.createFont(writer,false,false,null, (short) 0,Font.COLOR_NORMAL);
        //设置全局字体样式
        styleSet.setFont(font, true);
        //设置背景颜色 第二个参数表示是否将样式应用到头部
        styleSet.setBackgroundColor(IndexedColors.WHITE, true);
        //设置自动换行 当文本长于单元格宽度是否换行
        styleSet.setWrapText();
        // 设置全局边框样式
        styleSet.setBorder(BorderStyle.THIN, IndexedColors.BLACK);
        /**
         * 设置标题样式
         */
        setHeadCellStyle(writer,font);
        return styleSet;
    }

    /**
     * 方法描述: 设置标题的样式。
     * 特别说明：执行该方法后会自动修改表格的标题样式（也就是说函数用void修饰也可以）
     * @param writer
     * @param font                字体样式
     * @return org.apache.poi.ss.usermodel.CellStyle
     * @author wqf
     * @date 2021/5/28 10:16
     */
    private static CellStyle setHeadCellStyle(ExcelWriter writer,Font font) {
        CellStyle headCellStyle = writer.getHeadCellStyle();
        headCellStyle.setFont(font);
        //颜色对照表：https://www.cnblogs.com/yanjie-java/p/8329631.html。单元格背景要通过前景色实现
        //headCellStyle.setFillBackgroundColor(IndexedColors.GREY_40_PERCENT.getIndex());
        // 填充前景色
        headCellStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());
        return headCellStyle;
    }

    /**
     * 方法描述: 在原来的单元格的样式上将字体设置为红色，一般用于特殊样例
     * 特别说明：因为样式是克隆后创建的，因此获取返回值后要重新给相关单元格赋予样式才能生效
     * 说明：红色、倾斜字体，单元格垂直居中、自动换行
     * @param writer  writer
     * @param horizontalAlignment 水平居中模式
     * @return CellStyle
     * @author wqf
     * @date 2021/5/28 10:28
     */
    public static CellStyle createRedCellStyle(ExcelWriter writer, HorizontalAlignment horizontalAlignment) {
        //创建一个新的样式
        CellStyle cellStyle=writer.createCellStyle();
        cellStyle.cloneStyleFrom(writer.getCellStyle());//克隆原来表格单元格的样式，否则直接修改表格原有样式会造成整个表格样式的变化。
        //设置字体样式为红色
        Font font= MyHutoolExcelUtil.createFont(writer,false,true,null, (short) 0,Font.COLOR_RED);
        cellStyle.setFont(font);
        return cellStyle;
    }

    /**
     * 方法描述: 在原有样式的基础上，设置单元格的样式为正常样式
     * 说明：将已经设置为其他字体的样式恢复为原有样式
     * @param writer  writer
     * @param horizontalAlignment 水平居中模式
     * @return CellStyle
     * @author wqf
     * @date 2021/5/28 10:28
     */
    public static CellStyle createNormalCellStyle(ExcelWriter writer,HorizontalAlignment horizontalAlignment) {
        //创建一个新的样式
        CellStyle cellStyle=writer.createCellStyle();
        cellStyle.cloneStyleFrom(writer.getCellStyle());//克隆原来表格单元格的样式，否则直接修改表格原有样式会造成整个表格样式的变化。
        //设置字体样式为红色
        Font font= MyHutoolExcelUtil.createFont(writer,false,true,null, (short) 0,Font.COLOR_NORMAL);
        cellStyle.setFont(font);
        return cellStyle;
    }
}
